<?php
/**
 * Расширяет UPCPlus для использования в качестве узла сайта X4
 * 
 * * Вызов шаблонов
 * * upcAdvice Проверка уровня доступа 
 * * Обертка результата
 * * Монтирование в иерархию и конструкция из X4::Node()
 * 
 * @author Kain Haart <dev@mail.kain-haart.info>
 *
 */
class T4Node extends UPCPlus implements iUPC
{
##
# UPC Configuration
##
protected $aUPCHandlersList = array(UPCPlus::upcHandlerMethodCall,T4Node::upcHandlerTemplates);

public function __construct()
	{
	$this->aUPCHandlersInstructions['SelectView'] = NULL;
	}

##
# Templates extension
##

//TODO: Учесть разные перспективы в инструкциях шаблонов
	
/**
 * Указания по использованию шаблонов
 * @var string[string]
 */
protected $aTemplateInstructions = array();

/**
 * Кэшировать ли имена файлов фаблонов для представлений
 * @var unknown_type
 */
protected $bTemplatesCache = true;

/**
 * methodname TIP: upcHandler Templated views
 * @var string
 */
const upcHandlerTemplates = "upcTemplate";
/**
 * Отображение шаблона представления
 * @upcHandler
 * @param $Step mixed Текущий шаг UPC
 * @param $Request UPCRequest
 * @return string HTML-код представления
 */
public function upcTemplate($sNext,$mParams = NULL,$Request = NULL)
	{
	$sTemplate = $this->SelectView($sNext);
	if($sTemplate)
		{
		$mResult = T4Templater::Template($sTemplate,array('Nod'=>$this,'Params'=>$mParams,'Request'=>$Request));
		}
	return isset($mResult) ? $mResult : NULL;
	}

/**
 * "Раздел", которым проименованы шаблоны для этого модуля
 * @var string
 */	
protected $sChapter = "";
	
/**
 * Found template file by view name
 * @param $sView string View name
 * @return string Template Filename OR NULL if View template not found
 */
public function SelectView($sView)
	{
	# Read from templates table (cache or force)
	if(array_key_exists($sView,$this->aTemplateInstructions)) return $this->aTemplateInstructions[$sView];
	
	$sChapter = $this->sChapter ? $this->sChapter : get_class($this);
	$sPerspective = X4::getPerspective();
	
	# Prepare attempts list
	$Attempts = array();
	$Attempts []= X4_MODULES_DIR."/$sChapter/$sView.$sPerspective.tpl";
	$Attempts []= X4_MODULES_DIR."/$sChapter/$sView.tpl";
	$Attempts []= X4_TPL_DIR."/$sChapter/$sView.$sPerspective.tpl";
	$Attempts []= X4_TPL_DIR."/$sChapter/$sView.tpl";	
	$Attempts []= X4_TPL_DIR."/$sChapter.$sView.$sPerspective.tpl";
	$Attempts []= X4_TPL_DIR."/$sChapter.$sView.tpl";	
	
	# Check attempts
	$sTemplate = NULL;
	foreach ($Attempts as $sTemplateVariant)
		if(file_exists($sTemplateVariant))
			{
			$sTemplate = $sTemplateVariant;
			break;
			}
			
	# Cache
	if($this->bTemplatesCache)
		$this->aTemplateInstructions[$sView] = $sTemplate;
		
	# Result
	return $sTemplate;
	}


}